""""""
"""
______________________________
time：2021/5/26

封装一个对数据库进行操作的类
______________________________
写封装类的一些技巧：
1.往往将需求前端输入的一些参数当做构造方法init的一些参数传过来；



思考如何优化路径的问题？
"""

import pymysql
import random
from scripts.handle_yaml import do_yaml


class HandleMysql:
    def __init__(self):
        # 其他的实例方法中如果要用到conn就加个self
        # 连接数据库的操作就是经常使用不经常修改的操作，可以写到配置文件yaml中，从中读取配置文件信息
        self.conn = pymysql.Connect(host=do_yaml.read_yaml("mysql", "host"),
                                    port=do_yaml.read_yaml("mysql", "port"),
                                    db=do_yaml.read_yaml("mysql", "db"),  # 这个数据库名字打错了就会报错提示：1044
                                    user=do_yaml.read_yaml("mysql", "user"),
                                    passwd=do_yaml.read_yaml("mysql", "passwd"),
                                    charset='utf8',
                                    # 指定游标类为DictCursor，那么查询的返回结果的形式为：字典或嵌套字典的列表，方便后续对得到的结果进行数据处理,
                                    # 不传这个参数，那么查询的返回结果的形式默认为：元组或者嵌套元组的元组
                                    cursorclass=pymysql.cursors.DictCursor  # 类、对象一般不放配置文件中
                                    )

        self.cursor = self.conn.cursor()

    def get_values(self, sql, args=None, is_more=False):
        self.cursor.execute(sql, args)
        self.conn.commit()
        if is_more:  # is_more用于标识得到的返回结果是一行还是多行
            return self.cursor.fetchall()
        else:
            return self.cursor.fetchone()

    def close(self):
        self.cursor.close()
        self.conn.close()

    @staticmethod
    def create_mobile():
        """随机生成11位手机号"""
        return '133' + ''.join(random.sample('0123456789', 8))

    def is_existed_mobile(self, mobile):
        """判断手机号是否被注册过"""
        # sql = "SELECT * FROM member where mobile_phone =%s;"
        sql = do_yaml.read_yaml("mysql", "select_user_sql")
        if self.get_values(sql, args=[mobile]):  # 使用列表把要传的手机号参数传入
            return True  # 如果数据库中查到数据，则返回字典；如果没查到数据，返回None，则手机号不存在
        else:
            return False

    def register_not_existed_mobile(self):
        """随机生成一个数据库中不存在的手机号"""
        while True:
            one_mobile = self.create_mobile()
            if not self.is_existed_mobile(one_mobile):  # 如果数据库中不存在此手机号，则跳出循环
                break
        return one_mobile


if __name__ == '__main__':  # 快捷键:main+tab
    # 每当封装好一个类之后，要自测一下
    do_mysql = HandleMysql()
    # sql_1 = "SELECT * FROM member where mobile_phone ='13073783188'"
    # print(do_mysql.get_values(sql_1))
    # sql_3 = "SELECT* FROM member LIMIT 0,10;"
    # print(do_mysql.get_values(sql_3, is_more=True))
    # """
    # 日常操作数据库的工作场景：1，数据校验；2.取一些值获取数据的时候，这些情况我们一般都会知道获取结果是一条还是多条
    # """

    # print(do_mysql.is_existed_mobile('13073783188'))
    print(do_mysql.register_not_existed_mobile())
    do_mysql.close()
